package com.cursor.service;

import com.cursor.entity.CursorAccount;
import com.cursor.entity.LicenseKeys;
import com.cursor.repository.CursorAccountRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.util.Optional;

@Service
@RequiredArgsConstructor
public class CursorAccountService {
    
    private final CursorAccountRepository cursorAccountRepository;
    private final LicenseKeysService licenseKeysService;
    
    /**
     * 查找被分配给指定秘钥的账号
     * @param key 许可证秘钥
     * @return 账号信息（如果存在）
     */
    public Optional<CursorAccount> findByAssignedTo(String key) {
        return cursorAccountRepository.findByAssignedTo(key);
    }
    
    /**
     * 根据秘钥获取新账号（无论是否已分配过账号）
     * @param key 许可证秘钥
     * @return 新分配的账号
     */
    @Transactional
    public Optional<CursorAccount> getAccountByKey(String key) {
        // 首先检查许可证状态和积分
        Optional<LicenseKeys> licenseKey = licenseKeysService.getLicenseByKey(key);
        if (!licenseKey.isPresent()) {
            return Optional.empty(); // 许可证不存在
        }
        
        // 检查许可证状态
        String status = licenseKeysService.getLicenseStatus(licenseKey.get());
        if (!"已激活".equals(status)) {
            return Optional.empty(); // 许可证未激活或已过期
        }
        
        // 检查许可证积分是否足够
        if (!licenseKeysService.hasEnoughPoints(key, 50)) {
            return Optional.empty(); // 积分不足
        }
        
        // 寻找一个未分配的账号
        Optional<CursorAccount> availableAccount = cursorAccountRepository.findOneAvailableAccount();
        if (availableAccount.isPresent()) {
            CursorAccount account = availableAccount.get();
            account.setAssigned(true);
            account.setAssignedTo(key);
            account.setAssignedAt(LocalDate.now());
            
            // 扣除积分
            licenseKeysService.deductPoints(key, 50);
            
            return Optional.of(cursorAccountRepository.save(account));
        }
        
        return Optional.empty();
    }
} 